﻿#pragma once
#include <assert.h>

namespace DarkStorm2D {

	//Implementacja Scotta Bilasa
	template <typename T>
	//! Dziedziczenie publiczne: Singleton<MyClass>
	class Singleton
	{
	 static T* ms_Singleton;	//jedyny obiekt

	public:
		Singleton()
		{
			assert( !ms_Singleton );	//sprawdz, czy nie probujemy stworzyc Singletona poraz drugi

			//oblicza adres Singletona
			//obliczamy względny adres pochodnej
			//klasy o zapisujemy wynik tej operacji we wskaźniku singletonu (ms_Singleton)
			int offset = (int)(T*)1 - (int)(Singleton *)(T*)1;
			ms_Singleton = (T*)((int)this + offset);
		}

		~Singleton() {  assert( ms_Singleton );  ms_Singleton = 0;  }

		/*! 
		 * @return Jedyny obiekt.
		 */
		static T& GetSingleton() {  assert( ms_Singleton );  return ( *ms_Singleton );  }

		/*! 
		 * @return Wskaźnik na jedyny obiekt.
		 */
		static T* GetSingletonPtr()  {  return ( ms_Singleton );  }
	};

	//zmienna statyczna
	template <typename T> T* Singleton <T>::ms_Singleton = 0;

};